package se.janlindblom.ordning.helper;

/*
 * $Id: Hink.java 126 2010-01-04 19:33:23Z lindblom.jan $
 *
 * Copyright (c) 2009, Jan Lindblom
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * * Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 *
 * * Neither the name of the project nor the names of its contributors may be
 *   used to endorse or promote products derived from this software without
 *   specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 */

import java.util.ListIterator;
import java.util.Observable;
import java.util.Observer;
import java.util.Stack;
import se.janlindblom.ordning.Typ;

/**
 * Hink - intermediate storage place for {@link Typ} objects.
 *
 * @author Jan Lindblom (lindblom.jan@gmail.com)
 * @version $Rev: 126 $
 */
public class Hink extends Observable {
    private Stack<Typ> bucket;

    /**
     * Creates a new Hink. The Hink is {@link Observable} and notifies
     * {@link Observer}s when objects are put in the Hink.
     */
    public Hink() {
        bucket = new Stack<Typ>();
    }

    /**
     * Puts a {@link Typ} objects in the Hink. Notifies any {@link Observer}s
     * when called.
     *
     * @param object the object to put in this Hink
     */
    public synchronized void push(Typ object) {
        bucket.push(object);
        this.setChanged();
        this.notifyObservers(object);
    }

    /**
     * Returns and removes the last {@link Typ} object placed in the Hink.
     *
     * @return the last object placed in this Hink.
     */
    public synchronized Typ pop() {
        return bucket.pop();
    }

    /**
     * Returns the last {@link Typ} object in the Hink without removing
     * it from the Hink.
     *
     * @return the last object placed in the bucket.
     */
    public synchronized Typ peek() {
        return bucket.peek();
    }

    public synchronized ListIterator listIterator() {
        return bucket.listIterator();
    }
}
